package com.szh.zx.javacorecorret.chap2.two;


import java.util.concurrent.BrokenBarrierException;
import java.util.concurrent.CyclicBarrier;

// 章节 2.2.4
// 方法isBroken() 查询此屏障是否处于损坏状态
public class CyclicBarrierTest4 {
	public static void main(String[] args) {
		int parties = 4;
		CyclicBarrier cbRef = new CyclicBarrier(parties, new Runnable() {
			@Override
			public void run() {
				System.out.println("都到了");
			}
		});

		MyService4 myService = new MyService4(cbRef);
		Thread4[ ] threadArray =new Thread4[4];
		for (int i = 0; i < threadArray.length; i++) {
			threadArray[i] = new Thread4(myService);
			threadArray[i].start();
		}
		System.out.println("主线程结束");
	}
}
class Thread4 extends Thread{
	private MyService4 myService;

	@Override
	public void run() {
		myService.testA();
	}

	public Thread4(MyService4 myService) {
		this.myService = myService;
	}
}

class MyService4{
	private CyclicBarrier cbRef;

	public void beginRun(int count){
		try {
			System.out.println(Thread.currentThread().getName()+"到了 在等待其他人都到了开始起跑");
			if ("Thread-2".equals(Thread.currentThread().getName())){
				System.out.println("Thread-2 进来了");
				Thread.sleep(5000);
				// todo 主动让其抛出异常
				// 测试情况：1---下面这个语句会导致有一个线程出现异常，则其他线程继续等待，并不影响程序运行的主流程
//				Integer.parseInt("a");
				// 测试情况：2---下面这个语句，会导致全部线程进入catch 块中。
				Thread.currentThread().interrupt();
				// 总结：CyclicBarrier 对于线程的中断 interrupte 处理会使用 全有或者全无 的破坏模型，意思也就是说，如果一个线程超时或者抛出异常，其他的线程也会离开平章点
			}
			cbRef.await();
			System.out.println("都到了，开始跑");
			System.out.println(Thread.currentThread().getName()+" 到达了重点，并结束"+count+"赛程");
		} catch (InterruptedException e) {
			e.printStackTrace();
		} catch (BrokenBarrierException e) {
			System.out.println("进入了Bro"+cbRef.isBroken());
			e.printStackTrace();
		}
	}
	public void testA(){
		//比赛1个赛程
		for (int i = 0; i < 1; i++) {
			beginRun(i+1);
		}
	}
	public MyService4(CyclicBarrier cbRef) {
		this.cbRef = cbRef;
	}
}